package com.taobao.demo.goods.controller;
import com.taobao.demo.goods.common.Result;
import com.taobao.demo.goods.dto.GoodsDTO;
import com.taobao.demo.goods.dto.GoodsSaveDTO;
import com.taobao.demo.goods.service.IGoodsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 商品Controller（HTTP接口层）
 * 处理前端商品相关请求（新增、查询、上下架等）
 */
@RestController  // 标记为REST接口控制器，返回JSON
@RequestMapping("/api/goods")  // 基础请求路径
public class GoodsController {
    // 日志组件（记录错误和关键操作）
    private static final Logger log = LoggerFactory.getLogger(GoodsController.class);

    // 注入商品Service（调用业务逻辑）
    @Resource
    private IGoodsService goodsService;

    /**
     * 新增或更新商品（POST请求）
     * 前端传递JSON格式的商品数据，通过@RequestBody接收
     */
    @PostMapping
    public Result<?> save(@Validated @RequestBody GoodsSaveDTO saveDTO) {
        try {
            // 调用Service保存商品
            boolean success = goodsService.saveGoods(saveDTO);
            return success ? Result.success("商品操作成功") : Result.fail("商品操作失败");
        } catch (Exception e) {
            // 记录错误日志，返回错误信息
            log.error("新增/更新商品失败：{}", e.getMessage());
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 更新商品上下架状态（PUT请求）
     * 路径参数id：商品ID；查询参数status：目标状态（UP/DOWN）
     */
    @PutMapping("/{id}/status")
    public Result<?> updateStatus(
            @PathVariable Long id,  // 从URL路径获取商品ID
            @RequestParam String status  // 从URL查询参数获取状态
    ) {
        try {
            boolean success = goodsService.updateStatus(id, status);
            return success ? Result.success("状态更新成功") : Result.fail("状态更新失败");
        } catch (Exception e) {
            log.error("更新商品状态失败（ID：{}）：{}", id, e.getMessage());
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 减少商品库存（PUT请求）
     * 用于下单场景，减少指定数量的库存
     */
    @PutMapping("/{id}/stock")
    public Result<?> reduceStock(
            @PathVariable Long id,
            @RequestParam Integer quantity  // 减少的库存数量
    ) {
        try {
            boolean success = goodsService.reduceStock(id, quantity);
            return success ? Result.success("库存减少成功") : Result.fail("库存减少失败");
        } catch (Exception e) {
            log.error("减少商品库存失败（ID：{}）：{}", id, e.getMessage());
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 根据ID查询商品详情（GET请求）
     */
    @GetMapping("/{id}")
    public Result<GoodsDTO> getById(@PathVariable Long id) {
        try {
            GoodsDTO goodsDTO = goodsService.getGoodsById(id);
            return Result.success(goodsDTO);  // 成功返回商品详情DTO
        } catch (Exception e) {
            log.error("查询商品详情失败（ID：{}）：{}", id, e.getMessage());
            return Result.fail(e.getMessage());
        }
    }

    /**
     * 查询所有上架商品（GET请求）
     */
    @GetMapping("/list/up")
    public Result<List<GoodsDTO>> listUpGoods() {
        try {
            List<GoodsDTO> goodsList = goodsService.listUpGoods();
            return Result.success(goodsList);  // 成功返回上架商品列表
        } catch (Exception e) {
            log.error("查询上架商品失败：{}", e.getMessage());
            return Result.fail(e.getMessage());
        }
    }
}
